<?php

class DemandeController extends Controller
{
	public $layout='//layouts/selavenir_admin';
	public $skin = "";
	
	public function init()
	{
		$session=new CHttpSession;
		$session->open();
		if (isset($session["skin"])) $this->skin = $session["skin"];
	}

	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'accessControl', // perform access control for CRUD operations
			'postOnly + delete', // we only allow deletion via POST request
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules()
	{
		return array(
			array('allow',
					'actions'=>array('admin'),
					'expression' => array($this, 'isAdmin'),
			),
			array('allow', 
					'actions'=>array('liste','compte','view','viewModal','create','depot','repondre'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}
	
	/**
	 *  Function to control access
	 * @param CWebUser current user obj
	 * @param CAccessRule access rule obj
	 */
	public function isAdmin($user, $rule)
	{
		if(isset($user->admin) && $user->admin)
			return true;
		else
			return false;
	}
	
	/**
	 * Displays a particular model.
	 * @param integer $id the ID of the model to be displayed
	 */
	public function actionView($id)
	{
		$compte = 0;
		if (isset($_GET["compte"])) $compte = $_GET["compte"];
		$this->render('view',array(
				'model'=>$this->loadModel($id),
				'compte'=>$compte
		));
	}
	
	/**
	 * Displays a particular model.
	 * @param integer $id the ID of the model to be displayed
	 */
	public function actionViewModal($id)
	{
		$this->renderPartial('_view',array(
				'model'=>$this->loadModel($id),
		));
	}
	
	/**
	 * Creates a new model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 */
	public function actionCreate()
	{
		$model=new Demande;
	
		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);
	
		if(isset($_POST['Demande']))
		{
			$model->attributes=$_POST['Demande'];
			$model->date_demande = date('Y-m-d H:i:s');
			if ($model->idgrain == 0) {
				// nouveau grain
				$grain = new Grain();
				$grain->attributes = $_POST["Grain"];
				$grain->save();
				$model->idgrain = $grain->id;
			}
			if($model->save()) {
				if ($model->idseliste_cible>0) {
					// recherche d'un administrateur
					$admin = Seliste::model()->findByAttributes(array('admin'=>'1'));
					// envoi du message
					$message = new Message();
					$message->idseliste_rec = $model->idseliste_cible;
					$message->idseliste_em = $admin->id;
					$seliste = Seliste::model()->findByPk($model->idseliste);
					$message->sujet = "Nouvelle demande";
					$message->message = "Le séliste " . $seliste->pseudo . " a besoin de vous ! Une demande vous concernant a été faite, vous pouvez la consulter en cliquant sur la demande ci-dessus.";
					$message->auto = 1;
					$message->date = date('Y-m-d H:i:s');
					$message->iddemande = $model->id;
					$message->save();
				}
				
				if (Yii::app()->user->admin) {
					$this->redirect(array('admin'));
				} else {
					$this->redirect(array('liste'));
				}
			}
		}
	
		$this->render('create',array(
				'model'=>$model,
		));
	}
	
	/**
	 * Creates a new model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 */
	public function actionDepot()
	{
		$model=new Demande;
		$this->layout = "selavenir";
			
		if(isset($_POST['Demande']))
		{
			// ************************/
			// création d'une demande */	
			// ************************/
			$newg = false;
			$model->attributes=$_POST['Demande'];
			$model->date_demande = date('Y-m-d H:i:s');
			if ($model->idgrain == 0) {
				// nouveau grain : on teste si le grain n'a pas été ajouté entre temps
				$testgrain = Grain::model()->findByAttributes(array("nom"=>$_POST["Demande_grain"]));
				if (!$testgrain) {
					$newg = true;
					$grain = new Grain();
					$grain->attributes = $_POST["Grain"];
					$grain->nom = $_POST["Demande_grain"];
					$grain->idtype = $_POST["Type"]["id"];
					$grain->save();
					// on prévient éventuellement les admins qu'un grain a été créé
					if ($grain->status == 0) {
						$liste = array();
						$admins = Seliste::model()->findAllByAttributes(array("admin"=>1,"hum"=>1));
						foreach($admins as $admin) {
							$liste[] = array("id"=>$admin->id,"email"=>$admin->email,"modecontact"=>$admin->modecontact,"notif_message"=>$admin->notif_message,"notif_demande"=>$admin->notif_demande);
						}
						Message::send_message('newgrain',$grain->id,$model->idseliste,$liste);
					}
					$model->idgrain = $grain->id;
				} else {
					$model->idgrain = $testgrain->id;
				}
			}
			if($model->save()) {
				// ajout des destinataires de la demande
				$liste = array();
				if (isset($_POST['destinataires'])) {
					$destinataires = $_POST['destinataires'];
				} else {
					$destinataires = array(0);
				}
				if (in_array(0,$destinataires)) {
					// tout le monde (sauf le demandeur)
					$selistes = Seliste::model()->findAll(array("condition"=>"hum=1"));
					foreach ($selistes as $seliste) {
						if ($seliste->id <> $model->idseliste)
							$liste[] = array("id"=>$seliste->id,"email"=>$seliste->email,"modecontact"=>$seliste->modecontact,"notif_message"=>$seliste->notif_message,"notif_demande"=>$seliste->notif_demande);
					}
				} elseif (in_array(-1,$destinataires)) {
					// tous ceux qui proposent le grain (sauf le demandeur)
					$selistes = Seliste::model()->getSelistesGrain($model->idgrain);
					foreach ($selistes as $seliste) {
						if ($seliste->id <> $model->idseliste)
							$liste[] = array("id"=>$seliste->id,"email"=>$seliste->email,"modecontact"=>$seliste->modecontact,"notif_message"=>$seliste->notif_message,"notif_demande"=>$seliste->notif_demande);
					}
				} else {
					// la liste des personnes choisies par le demandeur (sauf le demandeur éventuellement choisi par lui-même !)
					foreach ($destinataires as $id) {
						$seliste = Seliste::model()->findByPk($id);
						if ($seliste->id <> $model->idseliste)
							$liste[] = array("id"=>$seliste->id,"email"=>$seliste->email,"modecontact"=>$seliste->modecontact,"notif_message"=>$seliste->notif_message,"notif_demande"=>$seliste->notif_demande);
					}
				}
				foreach ($liste as $elem) {
					$demande_seliste = new DemandeSeliste();
					$demande_seliste->iddemande = $model->id;
					$demande_seliste->idseliste = $elem["id"];
					$demande_seliste->save();
				}
				if (!$newg) {
					// le grain n'est pas nouveau
					// envoi du message de demande au(x) séliste(s) concerné(s)
					Message::send_message('demande',$model->id,$model->idseliste,$liste);
				}
				
				Yii::app()->user->setFlash('demande','La demande a été effectuée.');
				
				if (Yii::app()->user->admin) {
					$this->redirect(array('admin'));
				} else {
					$this->redirect(array('liste'));
				}
			}
		} else {
			$seliste = Seliste::model()->findByPk(Yii::app()->user->id);
			$model->modecontact = $seliste->modecontact;
			$this->render('depot',array(
					'model'=>$model,
					'seliste'=>$seliste
			));
		}
		
	}
	
	public function actionRepondre($id)
	{
		$model=new Offre;
		
		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);
	
		if(isset($_POST['Offre']))
		{
			$model->attributes=$_POST['Offre'];
			$model->date_offre = date('Y-m-d H:i:s');
			if($model->save()) {
				// recherche d'un administrateur
				$admin = Seliste::model()->findByAttributes(array('admin'=>'1'));
				// envoi du message au propriétaire de la demande
				$message = new Message();
				$message->idseliste_rec = $model->iddemande0->idseliste;
				$message->idseliste_em = $admin->id;
				$seliste = Seliste::model()->findByPk($model->idseliste);
				$nom = $seliste->id;
				if (($seliste->v_pseudo == 1) || ($seliste->v_nom == 1) || ($seliste->v_prenom == 1) || Yii::app()->user->admin) $nom .= " (";
				if ($seliste->v_pseudo == 1 || Yii::app()->user->admin) $nom .= $seliste->pseudo;
				if (($seliste->v_nom == 1) || ($seliste->v_prenom == 1) || Yii::app()->user->admin) $nom .= " - ";
				if ($seliste->v_nom == 1 || Yii::app()->user->admin) $nom .= $seliste->nom . " ";
				if ($seliste->v_prenom == 1 || Yii::app()->user->admin) $nom .= $seliste->prenom;
				if (($seliste->v_pseudo == 1) || ($seliste->v_nom == 1) || ($seliste->v_prenom == 1) || Yii::app()->user->admin) $nom .= ")";
				$message->sujet = "Offre proposée suite à votre demande n°".$model->iddemande;
				$message->message = "Le séliste n°" . $nom . " a proposé une offre concernant votre demande, vous pouvez la consulter en cliquant sur l'offre ci-dessus.";
				$message->auto = 1;
				$message->date = date('Y-m-d H:i:s');
				$message->idoffre = $model->id;
				$message->save();
				$this->redirect(array('offre/compte'));
			}
		}
		
		$demande = $this->loadModel($id);
		
		$this->render('repondre',array(
				'model'=>$model,
				'demande'=>$demande,
				'in'=>Propose::model()->findByAttributes(array('idgrain'=>$demande->idgrain,'idseliste'=>Yii::app()->user->id))
		));
	}
	
	/**
	 * Manages all models.
	 */
	public function actionAdmin($liste=false,$compte=false)
	{
		$model=new Demande('search');
		$model->unsetAttributes();  // clear any default values
		if ($compte) $model->idseliste = Yii::app()->user->id;
		if(isset($_GET['Demande'])) {
			$model->attributes=$_GET['Demande'];
			$model->type->id = $_GET['Type']['id'];
			$model->domaine->id = $_GET['Domaine']['id'];
		}
	
		$this->render('admin',array(
				'model'=>$model,
				'liste'=>$liste,
				'compte'=>$compte
		));
	}
	
	/**
	 * Liste des demandes
	 */
	public function actionListe()
	{
		$this->layout = "selavenir";
		$this->actionAdmin(true);
	}
	
	/**
	 * Compte perso demandes
	 */
	public function actionCompte()
	{
		$this->actionAdmin(false,true);
	}
	
	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return Seliste the loaded model
	 * @throws CHttpException
	 */
	public function loadModel($id)
	{
		$model=Demande::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}
	
}